package scm.erp.sale.refund.enums;

import com.fasterxml.jackson.annotation.JsonValue;
import scm.erp.core.mybatis.type.EnumValue;
import lombok.Getter;

/**
 * 退款状态枚举
 * 遵循枚举不可变性设计，消除冗余逻辑，确保状态与描述一一对应
 */
@Getter // Lombok 自动生成 getter 方法（替代手动编写）
public enum RefundStatus {

    // 枚举常量：value(状态码) + name(状态描述)，构造后不可修改
    APPLY(0, "申请"),
    CHECK(1, "审核"),
    PASS(2, "通过"),
    SETTLE(3, "结算"),
    DISABLE(4, "拒绝");

    /**
     * 状态码（数据库存储/接口传输用）
     * - @JsonValue：Jackson 序列化时默认返回该字段（前端接收状态码更统一）
     * - @EnumValue：MyBatis 枚举类型处理器识别字段（数据库映射用）
     * - final：确保不可变
     */
    @JsonValue
    @EnumValue
    private final Integer value;

    /**
     * 状态描述（前端展示用）
     * - final：枚举常量构造后不可修改，符合枚举设计规范
     */
    private final String name;

    // 构造方法：初始化状态码和描述（仅枚举常量初始化时调用）
    RefundStatus(Integer value, String name) {
        this.value = value;
        this.name = name;
    }

    // 【按需添加】根据状态码反向查询枚举（业务中常用，避免重复判断）
    public static RefundStatus getByValue(Integer value) {
        if (value == null) {
            return null; // 或抛出 IllegalArgumentException，根据业务容错需求调整
        }
        // 遍历枚举常量，匹配状态码
        for (RefundStatus status : RefundStatus.values()) {
            if (status.value.equals(value)) {
                return status;
            }
        }
        // 未匹配到状态码时返回 null（或抛出异常）
        throw new IllegalArgumentException("无效的退款状态码：" + value);
    }

    // 【按需添加】重写 toString()，便于日志打印（默认打印枚举名，重写后打印描述）
    @Override
    public String toString() {
        return String.format("[%d]%s", this.value, this.name);
    }
}